Este relatório, tem como objetivo analisar dados de commits no github. Utilizaremos uma amostra de dados da atividade global do github entre o período de 01/2016 e 05/2017. As linguagens que vamos analisar serão java e javascript.

Primeiro, será feita a importação dos dados já com as linguagens de interesse filtradas.

dados_github = read_csv(here("data/github-users-committing-filetypes.csv"),
                        progress = FALSE,
                        col_types = cols(file_extension = col_character(),
                                    month_day = col_integer(),
                                    the_month = col_integer(),
                                    the_year = col_integer(),
                                    users = col_integer())) %>% 
  filter(file_extension %in% c("java", "js"))
dados_github = dados_github %>% 
  mutate(date = paste(the_year, the_month, month_day, sep='-') %>%  as.Date(.))

dados_github$weekday = weekdays(as.Date(dados_github$date))

dados_github = dados_github %>% 
  mutate(is_weekend = ifelse(weekday %in% c("sábado", "domingo"),TRUE, FALSE))

dados_java = dados_github %>% 
  filter(file_extension == "java")

dados_js = dados_github %>% 
  filter(file_extension == "js")

Antes de responder algumas perguntas, vamos dar uma olhada na linha do tempo das duas linguagens.

Ano de 2016

p =
  dados_github %>% 
  filter(the_year == "2016") %>% 
  ggplot(aes(x=the_month, 
             y=users,
             text = paste("Mês:",the_month,
                            "\nQuantidade de Usuários:",
                            users))) +
     labs(y = "Quantidade de usuários", x = "Mês")+
    theme(legend.position="none") +
  geom_boxplot(colour = "#800000") + facet_wrap( ~ file_extension)
ggplotly(p, tooltip = "text")
rm(p)

Ano de 2017

p =
  dados_github %>% 
  filter(the_year == "2017") %>% 
  ggplot(aes(x=the_month, 
             y=users,
             text = paste("Mês:",the_month,
                            "\nQuantidade de Usuários:",
                            users))) +
     labs(y = "Quantidade de usuários", x = "Mês")+
    theme(legend.position="none") +
  geom_boxplot(colour = "#003366") + facet_wrap( ~ file_extension)
ggplotly(p, tooltip = "text")
rm(p)

Observando os dois boxplots, verificamos que há valores discrepantes, por esse motivo, iremos utilizar a mediana nos nossos experimentos.

Para cada uma delas, há uma diferença significativa na sua popularidade durante a semana e durante o fim de semana? Essa diferença é grande?

Para respondermos essa pergunta, precimas aplicar algumas técnicas de estatística. Primeiro, vamos utilizar o método de reamostragem chamado bootstrapping, ele é utilizado para aproximar distribuição na amostra de um levantamento estatístico. Após a aplicação desse método, o Intervalo de Confiança será calculado e assim poderemos inferir o resultado da amostra para toda a população.

Java

amostra_semana <- dados_java %>%  filter(is_weekend == "FALSE") %>% sample_n(70)
amostra_semana <- rename(amostra_semana,users_semana = users)

amostra_fim_de_semana <- dados_java %>%  filter(is_weekend == "TRUE") %>% sample_n(70)
amostra_fim_de_semana <- rename(amostra_fim_de_semana,users_fim_de_semana = users)

b <- bootstrap(amostra_semana, median(users_semana))
mediana_g1 <- CI.bca(b, probs = c(.05, .95))
mediana_g1
##                            5%  95%
## median(users_semana) 3471.181 3708
b <- bootstrap(amostra_fim_de_semana, median(users_fim_de_semana))
mediana_g2 <- CI.bca(b, probs = c(.05, .95))
mediana_g2
##                               5%  95%
## median(users_fim_de_semana) 1971 2143
rm (amostra_fim_de_semana)
rm(amostra_semana)
rm(b)

Aqui, iremos utilizar uma confiança de 95% para verificar os diferentes intervalos:

df <- data.frame(rbind(mediana_g1, 
                      mediana_g2))
df$medida = row.names(df)
df %>% 
  ggplot(aes(x = medida, ymin = X5., ymax = X95.)) + 
  geom_errorbar(width = .2)

rm (df)

Há claramente uma diferença entre a popularidade durante a semana e o fim de semana, os intervalos não se interceptaram e estão distantes.

Javascript

amostra_semana <- dados_js %>%  filter(is_weekend == "FALSE") %>% sample_n(70)
amostra_semana <- rename(amostra_semana,users_semana = users)

amostra_fim_de_semana <- dados_js %>%  filter(is_weekend == "TRUE") %>% sample_n(70)
amostra_fim_de_semana <- rename(amostra_fim_de_semana,users_fim_de_semana = users)

b <- bootstrap(amostra_semana, median(users_semana))
mediana_g1 <- CI.bca(b, probs = c(.05, .95))
mediana_g1
##                          5%  95%
## median(users_semana) 7101.5 7441
b <- bootstrap(amostra_fim_de_semana, median(users_fim_de_semana))
mediana_g2 <- CI.bca(b, probs = c(.05, .95))
mediana_g2
##                                 5%    95%
## median(users_fim_de_semana) 4105.5 4431.5
rm (amostra_fim_de_semana)
rm(amostra_semana)
rm(b)

Iremos utilizar o mesmo nível de confiança do experimento anterior (95%):

df <- data.frame(rbind(mediana_g1, 
                      mediana_g2))
df$medida = row.names(df)
df %>% 
  ggplot(aes(x = medida, ymin = X5., ymax = X95.)) + 
  geom_errorbar(width = .2)

rm(df)

Os resultados são iguais os do experimento com a linguagem Java, apenas diferindo na quantidade de usuários, ou seja, durante o período de fim de semana a popularidade é menor.

Existe uma diferença significativa entre a popularidade das duas linguagens nos fins de semana?

Utilizaremos a mediana e a técnica do bootstrapping para responder essa pergunta. O nível de confiança utilizado será 95%.

amostra_java <- dados_java %>%  filter(is_weekend == "TRUE") %>% sample_n(70)
amostra_java <- rename(dados_java,users_java = users)

amostra_js <- dados_js %>%  filter(is_weekend == "TRUE") %>% sample_n(70)
amostra_js <- rename(dados_js,users_js = users)

b <- bootstrap(amostra_java, median(users_java))
media_java <- CI.bca(b, probs = c(.05, .95))
media_java
##                      5%    95%
## median(users_java) 3338 3441.5
b <- bootstrap(amostra_js, median(users_js))
media_js <- CI.bca(b, probs = c(.05, .95))
media_js
##                    5%  95%
## median(users_js) 6648 6865
rm (amostra_java)
rm(amostra_js)
rm(b)

Vamos gerar o gráfico dos intervalos de confiança:

df <- data.frame(rbind(media_java, 
                      media_js))
df$medida = row.names(df)
df %>% 
  ggplot(aes(x = medida, ymin = X5., ymax = X95.)) + 
  geom_errorbar(width = .05)

rm(df)

Mais uma vez, os intervalos estão distantes um do outro, mostrando que existe uma diferença significativa entre os usuários das duas linguagens durante o fim de semana.